<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

<script>
  // 预解析

  // 声明式函数会提升，提升时会变成赋值式函数，并且直接给值
  // 函数提升的优先级会高于变量的提升
  // var fn = function() {
  //   console.log("fn");
  // }
  // var a;
  // console.log(a);
  // fn();
  // a = 3;





  // 当你使用 var 定义变量 和 声明式函数 重名的时候, 以 函数为主
  // 重名的时候也是函数的优先级更高
  // num()
  // var num = 100
  // num()
  // function num() { console.log('我是 num 函数') }
  // num()

  // 预解析之后：
  // var num = function() {console.log('我是 num 函数')};
  // var num;
  // num();
  // num = 100;
  // num();
  // num();









  // 预解析的特殊情况
  // 1. if的情况
  // if (false) {
  //   var a = 3;
  // }
  // console.log(a); // undefined
  // 首先if没有局部作用域
  // 哪怕if条件不满足，没有执行该代码，但是也会进行预解析

  // 2. 函数return的情况
  // function fn() {
  //   console.log(1);
  //   console.log(2);
  //   console.log(a);
  //   return;
  //   console.log(3);
  //   var a = 3;
  // }
  // fn();
  // 函数return后面的代码虽然不会执行，但是依旧会进行预解析



  // 自学：https://es6.ruanyifeng.com/#docs/let

  
</script>